package semantico;

import java.util.*;

public class TabelaSimbolos {
	
	static Hashtable<String, Simbolos> hashtable = new Hashtable<String, Simbolos>();
	
	public static boolean insere(String id, String cadeia, String token, String categoria, String tipo, String valor, String escopo, boolean flag) {
		
		Simbolos simbolo = new Simbolos();
		
		simbolo.setId(id);
		simbolo.setCadeia(cadeia);
		simbolo.setToken(token);
		simbolo.setCategoria(categoria);
		simbolo.setTipo(tipo);
		simbolo.setValor(valor);
		simbolo.setEscopo(escopo);
		simbolo.setFlag(flag);
		
		Simbolos simbolo1 = hashtable.get(id);
		
		if (simbolo1 == null) {
			hashtable.put(id,simbolo);
			//System.out.println("inseriu " + id);
			return true;
		}
		//System.out.println("nao inseriu");
		return false;
	}
	
	public static boolean remove(String escopo) {
		
		Enumeration e = hashtable.keys();
		int i = hashtable.size();
		
		if (i != 0) {
			while (e.hasMoreElements()) {
				Simbolos simbolo = hashtable.get(e.nextElement());
				if (simbolo.getEscopo() == escopo) {
					hashtable.remove(simbolo.getId());
				}
			}
			//System.out.println("removeu escopo");
			return true;
		}
		else {
			//System.out.println("nao removeu escopo");
			return false;
		}
	}
	
	public static boolean verifica(String id) {
		
		Simbolos simbolo = hashtable.get(id);
		
		if (simbolo != null) {
			//System.out.println("existe");
			return true;
		}
 		//System.out.println("nao existe");
		return false;
	}
	
	public static boolean verifica_tipo_procedimento(String id) {
		
		Simbolos simbolo = hashtable.get(id);
		
		if (simbolo.getCategoria().equals("procedimento")) {
			return true;
		}
		else
			return false;
			
	}
	
	public static boolean atualiza(String id, String valor, String token) {
		
		Simbolos simbolo = hashtable.get(id);
		
		if ((simbolo != null) && (simbolo.getToken() == token)) {
			
			simbolo.setValor(valor);
			hashtable.remove(id);
			hashtable.put(id,simbolo);
			
			Simbolos simbolo1 = hashtable.get(id);
			//System.out.println("atualizou - novo valor: " + simbolo1.getValor());
			return true;
		}
 		//System.out.println("nao atualizou");
		return false;
	}
	
	public static String retorna_tipo(String id) {
		
		Simbolos simbolo = hashtable.get(id);
		if (simbolo != null){
			if(simbolo.getTipo().equals("real")  || simbolo.getTipo().equals("inteiro" )|| simbolo.getTipo().equals("nullreal") || simbolo.getTipo().equals("nullinteiro") ){
				return "numero";
			}
		}
		if (simbolo != null) {
			if(simbolo.getTipo().equals("endereco")){
				return "ponteiro";
			}
		}
		if (simbolo != null) {
			if(simbolo.getTipo().equals("literal") || simbolo.getTipo().equals("cadeia") || simbolo.getTipo().equals("nullliteral") ){
				return "literal";
			}
		}
		
		if (simbolo != null) {
				return simbolo.getTipo();
		}
		return "";
	}
	
public static boolean atualiza_tipo(String tipo) {
		
		Enumeration e = hashtable.keys();
		int i = hashtable.size();
		
		if (i != 0) {
			while (e.hasMoreElements()) {
				Simbolos simbolo = hashtable.get(e.nextElement());
				if (simbolo.getFlag() == true) {
					simbolo.setTipo(simbolo.getTipo() + tipo);
					simbolo.setFlag(false);
					hashtable.remove(simbolo.getId());
					hashtable.put(simbolo.getId(),simbolo);
				}
			}
			return true;
		}
		else 
			return false;
				
	}
	
	
	public static void main(String[] args) {
				
			
		
	}
	
}
